[4-Gin路由基础]
一 路由的基本使用
1.1 基本路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "github.com/gin-gonic/gin" "net/http" )
func funcPost(c *gin.Context) { c.String(http.StatusOK, "post请求") } func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(http.StatusOK, "hello word") }) r.POST("/",funcPost) r.Run(":8000") }
|
1.2 获取路径中参数(动态路由)
- 可以通过Context的Param方法来获取API参数
- localhost:8000/user/lqz/nb
- /:name表示一个字符串或int类型
- /*action表示任意字符串,包括/,如 /nb/hadsome,
*
号类型的参数,表示匹配所有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package main
import ( "fmt" "github.com/gin-gonic/gin" "net/http" "strings" )
func main() { r := gin.Default() r.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") fmt.Println(action) action = strings.Trim(action, "/") fmt.Println(action) c.String(http.StatusOK, name+" is "+action) }) r.Run(":8000") }
|

1.3 获取请求地址中参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package main
import ( "fmt" "net/http"
"github.com/gin-gonic/gin" )
func main() { r := gin.Default() r.GET("/user", func(c *gin.Context) { name := c.Query("name") c.String(http.StatusOK, fmt.Sprintf("hello %s", name)) }) r.Run() }
|
不传递参数输出的结果:

传递参数输出的结果:

1.4 获取表单参数
- 表单传输为post请求,http常见的传输格式为四种:
- application/json
- application/x-www-form-urlencoded
- application/xml
- multipart/form-data
- 表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package main
import ( "fmt" "net/http"
"github.com/gin-gonic/gin" )
func main() { r := gin.Default() r.POST("/form", func(c *gin.Context) { username := c.PostForm("username") password := c.PostForm("password") body,_ := ioutil.ReadAll(c.Request.Body) fmt.Println("---body--"+string(body)) c.String(http.StatusOK, fmt.Sprintf("用户名:%s,密码:%s", username, password)) }) r.Run() }
|

1.5 Json 编码格式解析到结构体
客户端传参,后端接收并解析到结构体定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package main
import ( "github.com/gin-gonic/gin" "net/http" )
type Login struct { User string `json:"username" binding:"required"` Password string `json:"password" binding:"required"` }
func main() { r := gin.Default() r.POST("/loginJSON", func(c *gin.Context) { var login Login if err := c.ShouldBindJSON(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if login.User == "lqz" && login.Password == "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "100", "msg": "登陆成功"}) }else { c.JSON(http.StatusOK, gin.H{"status": "101","msg": "用户名或密码错误"}) }
}) r.Run(":8000") }
|
使用postman测试,编码使用json格式,向http://127.0.0.1:8000/loginJSON发送post请求
{“username”:”lqz”,”password”:”123”}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package main
import ( "github.com/gin-gonic/gin" "net/http" )
type Login struct { User string `form:"username" binding:"required"` Password string `form:"password" binding:"required"` }
func main() { r := gin.Default() r.POST("/loginForm", func(c *gin.Context) { var login Login if err := c.Bind(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if login.User == "lqz" && login.Password == "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "100", "msg": "登陆成功"}) }else { c.JSON(http.StatusOK, gin.H{"status": "101","msg": "用户名或密码错误"}) }
}) r.Run(":8000") }
|
使用postman测试,编码使用urlencoded或form-data格式,向http://127.0.0.1:8000/loginForm发送post请求
1.7 动态路由数据解析到结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package main
import ( "fmt" "github.com/gin-gonic/gin" "net/http" )
type Login struct { User string `uri:"username" binding:"required"` Password string `uri:"password" binding:"required"` }
func main() { r := gin.Default() r.GET("login/:username/:password", func(c *gin.Context) { var login Login if err := c.ShouldBindUri(&login); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } fmt.Println(login.Password,login.User) if login.User != "lqz" || login.Password != "123" { c.JSON(http.StatusBadRequest, gin.H{"status": "304", "msg": "用户名或密码错误"}) return } c.JSON(http.StatusOK, gin.H{"status": "200"}) }) r.Run(":8000") }
|
使用postman测试,编码使用urlencoded或form-data格式,向http://127.0.0.1:8000/login/lqz/123发送get请求
1.8 post或get提交数据解析到结构体
ShouldBind
会按照下面的顺序解析请求中的数据完成绑定:
- 如果是
GET
请求,http://127.0.0.1:8000/loginForm/?username=lqz&password=123
- 如果是
POST
请求,三种编码格式都支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package main
import ( "github.com/gin-gonic/gin" "net/http" )
type Login struct { User string `form:"username" json:"username" uri:"username" binding:"required"` Password string `form:"password" json:"password" uri:"password" binding:"required"` }
func main() { router := gin.Default() router.POST("/loginJSON", func(c *gin.Context) { var login Login if err := c.ShouldBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } })
router.GET("/loginForm", func(c *gin.Context) { var login Login if err := c.ShouldBind(&login); err == nil { c.JSON(http.StatusOK, gin.H{ "user": login.User, "password": login.Password, }) } else { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } }) router.Run(":8000") }
|
1.9 xml格式解析到结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <?xml version="1.0" encoding="UTF-8"?> <login> <username type="string">刘清政</username> <password type="string">123</password> </login> package main
import ( "encoding/xml" "fmt" "github.com/gin-gonic/gin" )
type Login struct { User string `xml:"username" binding:"required"` Password string `xml:"password" binding:"required"` }
func main() { router := gin.Default() router.POST("/loginXml", func(c *gin.Context) { var login Login body,_:=c.GetRawData() err:=xml.Unmarshal(body,&login) if err != nil { fmt.Println(err) c.String(200,"解析xml失败") return }
fmt.Println(login) c.String(200,"解析xml成功") }) router.Run(":8000") }
|
使用postman向http://127.0.0.1:8000/loginXml发送post请求,携带上面xml数据
二 不使用默认中间件
使用
代替